<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>类</title>
    <!-- 
        1、类中的构造器不是必须要写的，如果想给实例添加一些自己独有的属性，那么就要写构造器
        2、如果A类继承了B类，且A类中写了构造器，那么A类的构造器中必须调用super\
        3、类中的方法是放在类的原型对象上，供实例使用。如果是通过实例调用的方法，那么方法中的this就是实例对象
     -->
</head>

<body>
    <script>
        // 定义一个Person类
        class Person {
            constructor(name, age) {
                // 构造器中的this是谁？---当前类的实例对象
                this.name = name
                this.age = age
            }
            // 一般方法
            /*  
                1、speak放在哪里----- Person 的原型对象上，供实例使用
                2、speak中的this是谁？---- 如果speak是通过Person实例调用的，那么this就是Person实例对象
            */
            speak() {
                // console.log('巴拉巴拉');
                console.log(`我叫${this.name}，今年${this.age}岁了`);
            }
        }
        class Student extends Person {
            constructor(name, age, grade) {
                // super 之前可以有代码，但是不能有this
                super(name, age);
                this.grade = grade
            }
            // 重写从父类继承过来的方法
            speak() {
                console.log(`我叫${this.name},今年${this.age}了，读${this.grade}了`);
            }
            /*
                1、study 放在了哪里? ---- Student 的原型对象上，供实例使用
                2、study中的this是谁？ --- 如果study是通过Student实例调用的，那么this就是Student的实例对象
            */
            study() {
                console.log('我正在学习');
            }
        }

       /*  // 创建一个Person的实例对象
        const p1=new Person('张三',20)
        console.log(p1);
        p1.speak()

        // 创建一个Student的实例对象
        const s1=new Student('kiki',21,'高一')
        console.log(s1);
        s1.speak()
 */

        class Car {
            // 类中能写什么代码？？
            // 构造器方法
            constructor(name, price) {
                this.name = name;
                this.price = price
            }

            // 一般方法
            run() {
                console.log(`我正在前进......`);
            }

            // 赋值语句 如a=1,给实力自身添加一个属性，名为a，值为1
            a = 1;
            b = function(){
                // this 指的是 实例对象
                console.log(this);
                console.log('我是b函数');
            }
        }

       /*  const c = new Car('丰田', '20w')
        console.log(c);
        c.run()
        c.b() */

        class Dog{
            constructor(){

            }
            run(){
                
            }
            a=1;  //在实例身上
            static b=2;  // 在类自身身上
        }

        const d=new Dog()
        console.log(d);
        console.log(Dog.b);
    </script>

</body>

</html>